/**
 *  mysql 官方网站： https://www.mysql.com/
 *   数据库特点：
 *      数据以表格形式出现
 *      表格中每一行表示一组数据
 *      每一列表示某组数据对应的字段（属性）
 *      若干这样的行和列就组成了一张表
 *      若干个表组成一个库
 *
 * 集成工具：XAMPP ：https://www.apachefriends.org/index.html
 *    安装目录中不能出现中文
 *    打开XAMPP MySQL start 即可  3306 默认端口
 *
 *  连接mysql:
 *     通过cli（命令行）进行连接管理数据
 *     通过gui（图形用户界面）程序进行连接管理数据库
 *     通过程序（Node.js/PHP/Java...）提供的API连接管理数据库
 *
 *  cli:
 *     安装目录下/mysql/bin 目录 ： mysql -uroot -p     (mysql执行 -u root用户名 -p:密码)
 *      Enter password:
 *     看到 Welcome to the MariaDB monitor 信息则连接成功  （输入命令是必须以;或\g结尾）
 *
 *    常用命令：
 *        show databases;                         > 查看所有数据库
 *        create database 数据库名称;              > 创建新的数据库
 *        use 数据库名称;                          > 选择要操作的数据库
 *        show tables;                            > 查看当前数据库的表
 *        select * from 数据表名;                  > 查看表中所有的数据 (不推荐使用)
 *        select 表字段1,表字段2... from 数据表名;  > 查看表中表字段1和2...的数据*     
 *        drop database 数据库名称;                > 删除数据库   
 *        exit;                                   > 退出数据库
 * 
 * 
 *        insert into 表名 (表字段1,表字段2...) values (表字段1的值,表字段2的值...)      > 新增表数据
 * 
 *        update 数据表名 set 表字段=新值           > 更新数据库中的数据 
 *        update todo set done=1 where id=3;    ==>  更新todo数据表中id为3的done字段为1
 * 
 *        delete from 数据表名                     > 删除数据
 *        delete from todo where id=2           ==>  删除数据表中id为2的数据
 * 
 *      新增、删除、更新 都有一个影响的行(affectedRows)返回
 * 
 * 
 *        select distinct 表字段 from 数据表名      =>  查询表中表字段值不重复的记录 (distinct:去重)
 *  
 *        select 表字段 from 数据表名 order by 表字段1 DESC/ASC, 表字段2 DESC/ASC ...   > 按升降序查看表中的数据  (排序)  desc:降序 asc:升序(默认)
 *        select 表字段 from 数据表名 limit 3(数量)                                    > 查询表中3条数据         (限制)       
 *              select 表字段 from 数据表名 limit 3,2       ==> 偏移量和限制连写的方式：此时表示的是偏移量为3，数量限制2条  (limit 逗号分开的形式)       
 *   × : (offset必须和limit一起使用,且limit在前)   
 *        select 表字段 from 数据表名 offset 1(数量)        > 从第2个数据开始查询表中数据  (偏移量) offset=0时，从第一条开始查询 
 *      
 *        select 表字段 from 数据表名 where gender="男" and/or  另一个查询条件...       > 从数据中查询gender字段为男的数据 条件查询 (gender="男" : 查询条件) and:并且 or：或
 *          查询语句操作符： =  >   <   !=  >=  <=
 * 
 *      模糊查询：LIKE
 *          模糊查询通常与 % 配合使用， * : 通配
 *          %lang : 以lang结尾的内容
 *          lang% : 以lang开头的内容
 *         %lang% : 包含lang的内容
 *      select name from user where name like '%lang%'   =>  查询user表中name字段中值包含lang的数据
 *      NOT LIKE：与LIKE相反
 * 
 *      多值匹配：IN
 *          delete from todo where id in (3,6,9)  ==>  删除todo表中id为3,6,9的数据
 *      NOT IN：与IN相反
 * 
 *      范围查询:BETWEEN
 *          select * from user where age between 10 and 20  ==> 查询user表中age值在10~20之间的数据
 *      NOT BETWEEN: 与BETWEEN相反
 * 
 *   函数：SQL提供了一些内置函数，以便对数据进行一些常规操作
 *      聚合函数：计算从列表中取得的值，返回一个单一的值，如：COUNT、SUM、AVG、MAX、MIN ...
 *                  - SELECT COUNT(name) FROM user  => 返回user表中name字段的行数(查询当前数据的总数)
 *                  - SELECT SUM(age) FROM user     => 返回user表中age字段所有值的和（求和）
 *                  - SELECT AVG(age) FROM user     => 返回user表中age字段所有值的平均值(求平均值)
 *      标量函数：基于输入值，返回一个单一的值，如：UCASE、LCASE、NOW ...
 *                  - SELECT UCASE(name) FROM user  => 将user表中name字段的值转换为大写
 *                  -        LCASE                  => 转换为小写
 *                  
 * 
 *      
 *
 * XAMPP默认的数据库列表  infomation_schema，mysql，performance_schema 内置的数据库（不宜更改）
 *   infomation_schema
 *   mysql
 *   performance_schema
 *   phpmyadmin
 *   test
 *
 *  mysql 数据类型：https://dev.mysql.com/doc/refman/5.7/en/data-types.html
 * 
 * 
 *  node 操作 mysql  ( mysql2 : https://www.npmjs.com/package/mysql2 )
 *      通过query()方法操作数据库   query('sql语句',[依次对应占位符的属性值])
 * 
 *  查询参数的占位符表达式(?? 和 ?)： 
 *      ?? =>  表字段/属性
 *      ?  =>  值
 *    query('select ?? from king limit ? offset ?',['name',6,1])   // 查询数据库为king字段为name的数据6条，偏移数量1 
 *   
 * 
 *
 */

// 分页的功能：通过offset 和 limit 设置
    let page = 1;
    let pageCount = 20;
    `SELECT * FROM 数据表名 LIMIT ${page} OFFSET ${(page - 1) * pageCount}`

/**
 *  存储引擎：数据在计算机上存储的方式
 *      MySQL常见存储引擎：InnoDB、MyISAM等
 *          - InnoDB 的优势在于提供了良好的事务处理、崩溃修复能力和并发控制。缺点是读写效率差，占用的数据空间相对较大
 *          - MyISAM 的优势在于占用空间小，处理速度快。缺点是不支持事务的完整性和并发性
 * 
 *  字符集、编码：指数据库存储的数据编码
 *          - utf8mb4 : 支持更多的unicode字符(四字节) 如：表情等
 *          更常用的还是utf8
 * 
 *  数据校对 : 数据库除了要存储数据，还要对数据进行排序，比较等操作，不同的校对规则会有不同的结果
 *          - utf8mb4_unicode_ci : 基于标准的Unicode来排序和比较，能够在各种语言之间精确排序 (不区分大小写)
 *          - utf8mb4_bin 和 utf8mb4_unicode_cs 区分大小写
 *  
 *  数据类型：
 *          数字类型：INTEGER,INT,SMALLINT,FLOAT,DOUBLE ...
 *          日期时间类型： DATE,DATEIME,TIM,YEAR ...
 *          字符串类型： CHAR,VARCHAR,BLOB,TEXT,ENMU ...
 *                  -CHAR: 定长 (如果设置char类型长度为8个字节，就算你的值没有8个字节的长度，也会被填满空字符，如果超过则超过部分会被去掉) 0~255 bytes
 *                  -VARCHAR : 不定长（值为多少个长度的字节就是多少字节）   0~65535 bytes
 * 
 *  主键：表中的一个或多个字段，它的值用于唯一地标识表中的某一条记录，用来保持数据的完整性
 *          一个表只能有一个主键
 *          主键可以是一个字段，也可以是由多个字段组成
 *          主键值不能重复
 *          加快对数据的操作
 * 
 *  自增：添加数据的时候由数据库自动设置的值
 *      - 一般在设计表的时候会设置一个自动增加字段作为主键(id)
 *  
 *  索引：对表中一列或多列的值进行排序的一种结构，使用索引可以快速访问表中特点的信息，加快对表中记录的查找或排序
 * 
 *           
 */

/**

       user表                               comment表       
        id      username                    cid       mes
        1       张三            |             1         那都不是事
        2       李四            |             1         小问题
        3       王五            |             2         伤害性不大，侮辱性极强
        4       老王            |             1         别慌，小场面
        5       老许            |             7         年轻人耗子尾汁
        6       小李            |             1         问你服不服
        7       小红            |             3         牛批

  假设有上述user表和comment表，comment为user的关联表，希望查询列出所有的user表，并user表的id和comment的uid相对应的数据
  即：
        id      username                    cid       mes
        1       张三                         1         那都不是事
                                             1         小问题
                                             1         别慌，小场面
                                             1         问你服不服
        2       李四                         2         伤害性不大，侮辱性极强      
        3       王五                         3         牛批      
        4       老王                         
        5       老许                         
        6       小李                        
        7       小红                         7         年轻人耗子尾汁 



    多表查询
        select * from 表一，表二 where 表一字段 运算符 表二字段
        (select * from user,comment where user.id=comment.cid)   // 这样列出来的表则没有id为4，5，6的数据了
    内连接
        select * from 表一 join 表二 on 表一字段 运算符 表二字段
        (select * from user join comment on user.id=comment.cid) 等同于 (select * from user,comment where user.id=comment.cid) 
    左连接
        select * from 表一 left join 表二 on 表一字段 运算符 表二字段  即可实现上面的需求
        (select * from user left join comment on user.id=comment.cid)
    右链接
        select * from 表一 right join 表二 on 表一字段 运算符 表二字段    相反：取所有的comment表 并对应得id
        (select * from user right join comment on user.id=comment.cid)
*/

/**
 *  1.创建数据库    todo数据库，字符集编码为utf8mb4，数据校对规则为utf8mb4_bin
 *      CREATE DATABASE todo DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_bin 
 * 
 *  2.创建表
 *      CREATE TABLE 数据表名称(
            字段名称 字段属性...,
            PRIMARY KEY(主键字段名称),
            INDEX 索引名称(索引字段...)...
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8

        - 字段名称一般会用 `` 符号区分,而不是''
        - 字段属性设置：
            字段类型： int(10) / char(10) / varchar(200) ...
            无符号： UNSIGNED
            是否为null： NOT NULL
            自动增长： AUTO_INCREMENT
            默认值： DEFAULT 0

        CREATE TABLE user(
            `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
            `name` VARCHAR(20) NOT NULL DEFAULT '',
            `gender` ENUM('男','女') NOT NULL DEFAULT '男',
            PRIMARY KEY (`id`)
        )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_bin;

    3.插入数据
            INSERT INTO user (name,gender) VALUES ('yy','男')
        批量插入：values 以逗号分开
            INSERT INTO user (name,gender) VALUES ('yy','男'),('zz','女');

    4.删除数据
            DROP 表名称 ：删除表、数据以及结构
            TRUNCATE 表名称： 删除表的数据，保留结构，不支持事务，不可撤销恢复
            DELETE 表名称： 删除表的数据，保留结构，支持事务
 *      
 */